#pragma once

#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>

// 日志有日志等级
#define DEBUG   0
#define NORMAL  1
#define WARNING 2
#define ERROR   3 /* 出错了，但不影响运行 */
#define FATAL   4 /* 出错了，且不能继续运行 */

const char* to_levelstr(int level)
{
    switch(level)
    {
        case DEBUG: return "DEBUG";
        case NORMAL: return "NORMAL";
        case WARNING: return "WARNING";
        case ERROR: return "ERROR";
        case FATAL: return "FATAL";
        default: return nullptr;
    }
}


void logMessage(int level, const char* format, ...)
{
#define NUM 1024
    char logPrefix[NUM];// 日志前缀
    char logContent[NUM];// 日志内容
    snprintf(logPrefix, sizeof(logPrefix), "[%s][%ld][pid: %d]", to_levelstr(level), time(nullptr), getpid());/*time_t time(time_t *tloc); time_t = long int*/
    va_list arg;
    va_start(arg, format);// 函数参数压栈的顺序是从右往左
    vsnprintf(logContent, sizeof(logContent), format, arg);

    std::cout << logPrefix << logContent << std::endl;
}